package com.register;

import com.message.constant.Host;
import com.message.register.RpcRegisterRequest;
import com.message.register.RpcRegisterResponse;
import lombok.extern.slf4j.Slf4j;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Stream;

/**
 * @author linyu.dai
 * @project rpc
 * @description 注册信息
 * @creat 2022/11/27 17:18:19
 */
@Slf4j
public class RegisterInfo {

    private static  Map<String, Host> REGISTER_INFO = new ConcurrentHashMap<>();

    public static void register(RpcRegisterRequest rpcRegisterRequest, RpcRegisterResponse rpcRegisterResponse){
        //添加相关信息 如果!为空 说明添加失败
        Optional.ofNullable(REGISTER_INFO.get(rpcRegisterRequest.getApplicationName()))
                .ifPresentOrElse(host -> {
                    //如果有 可能是重新连接 判断主机号
                    if (!host.equals(rpcRegisterRequest.getHost())) {
                        rpcRegisterResponse.setErrorMessage(List.of("服务注册失败 不能存在同名的服务"));
                    }
                }, () -> {
                    //如果不存在直接添加
                    REGISTER_INFO.put(rpcRegisterRequest.getApplicationName(), rpcRegisterRequest.getHost());
                    //返回所有服务器的相关信息
                    HashMap<String, Host> registerMap = new HashMap<>();
                    REGISTER_INFO.forEach((k, v) -> {
                        if (!k.equals(rpcRegisterRequest.getApplicationName())) {
                            registerMap.put(k, v);
                        }
                    });
                    //返回除自己之外的服务器信息
                    rpcRegisterResponse.setRegisterInfo(registerMap);
                });

    }


    public static void remove(String serverName) {
        REGISTER_INFO.remove(serverName);
    }

}
